import {
  useCounterStore
} from "@/stores/counter"
import axios from "axios"
import router from "@/router"
import {
  ElLoading,
  ElMessage
} from 'element-plus'



const options = {
  lock: true,
  text: 'Loading',
  background: 'rgba(0, 0, 0, 0.7)'
}





// 创建axios实例,将来对创建出来的实例,进行自定义配置
// 好处:不会污染原始的 axios实例
const instance = axios.create({
  baseURL: 'http://localhost:8000/',
  timeout: 5000
})
// 自定义配置 --请求响应拦截器
// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // 开启loading,禁止背景点击(节流处理,防止多次无效触发)
  ElLoading.service(options)
  // 只要有token，就在请求时携带,便于请求需要授权的接口
  const token = useCounterStore().token // getters里的token方法
  if (token) {
    //与后端名一样
    config.headers['token'] = token
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  const res = response
  if (res.status !== 200) {
    // 给错误提示，Toast默认是单例子模式,后面的Toast调用了,会将前一个Toast效果覆盖
    // 同时只能存在一个Toast
    ElMessage.error(res.message)
    // 抛出一个错误promise
    return Promise.reject(res.message)
  } else {
    // 正确情况,直接走业务核心逻辑，清除loading效果
    const loading = ElLoading.service(options)
    loading.close()

  }
  return res
}, function (error) {
  const res = error.response
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  console.log(res)
  if (res === undefined) {
    //关闭loading效果
    const loading = ElLoading.service(options)
    loading.close()
    ElMessage.error('请求失败')
    return Promise.reject(error)
  } 

  if (res.status === 401) {
    //关闭loading效果
    const loading = ElLoading.service(options)
    loading.close()
    // 清除token
    useCounterStore().clearUserInfo()
    ElMessage.error("登录已过期,请重新登录")
    // 跳转到登录页
    router.replace({
      path: '/login',
      query: {
        redirect: router.currentRoute.fullPath
      }
    })
    return Promise.reject(error)
  }

  if (res.status !== 200) {
    //关闭loading效果
    const loading = ElLoading.service(options)
    loading.close()
    ElMessage.error(res.data.error)
    return Promise.reject(error)
  }

})




// 导出配置好的实例
export default instance